package controlleur;

import java.util.ArrayList;
import model.Carte;
import model.FileMessage;
import model.IA;
import model.Joueur;
import model.Main;
import model.PartieCarteObservateur;
import model.Systeme;

/**
 * Classe qui fait le lien entre le modèle et la vue Elle a un système qu'elle
 * prend en paramètre, et une main qui reprèsente la main du joueur 1. Elle
 * reprend toutes les méthodes de la main et du système.
 *
 * @author Antoine Thorr, Joana Santos, Samy Rida, Vicky Ngo Pagbe
 */
public class ControleurDeJeu {

    private Systeme sys;
    private Main m;

    /**
     *
     * @param sys
     */
    public ControleurDeJeu(Systeme sys) {
        this.sys = sys;
        this.m = this.sys.getJoueur().getMain();
    }

    /**
     *
     * @return
     */
    public Systeme getSysteme() {
        return this.sys;
    }

    /**
     *
     */
    public void afficherTerrain() {
        this.sys.afficherTerrain();
    }

    /**
     *
     * @return
     */
    public FileMessage getFileMessage() {
        return this.sys.getFm();
    }

    /**
     *
     * @return
     */
    public boolean aPioche() {
        return sys.aPioche();
    }

    /**
     *
     */
    public void piocher() {
        if (!this.sys.aPioche()) {
            this.sys.piocher();
            this.sys.addMessage("Carte piochée");
            this.sys.addMessage("Posez une carte &/ou attaquez");
        } else {
            this.sys.addMessage("Déja pioché");
        }
    }

    /**
     *
     * @param m
     */
    public void addMessage(String m) {
        this.sys.addMessage(m);
    }

    /**
     *
     */
    public void melanger() {
        this.sys.melanger();
    }

    /**
     *
     */
    public void notifierObs() {
        this.sys.notifierObs();
    }

    /**
     *
     * @param pco
     */
    public void addObs(PartieCarteObservateur pco) {
        this.sys.addObs(pco);
    }

    /**
     *
     * @param pco
     */
    public void removeObs(PartieCarteObservateur pco) {
        this.sys.removeObs(pco);
    }

    /**
     *
     * @return
     */
    public Joueur getJoueur() {
        return this.sys.getJoueur();
    }

    /**
     *
     * @return
     */
    public IA getIA() {
        return this.sys.getIA();
    }

    /**
     *
     * @return
     */
    public int getTour() {
        return this.sys.getTour();
    }

    /**
     *
     * @param c
     */
    public void piocher(Carte c) {
        this.m.piocher(c);
    }

    /**
     *
     * @param c
     */
    public void defausser(Carte c) {
        this.m.piocher(c);
    }

    /**
     *
     * @param c
     */
    public void poser(Carte c) {
        // TODO - implement Main.poser
        this.m.poser(c);
    }

    /**
     *
     * @return
     */
    public Carte isSelection() {
        return sys.isSelection();
    }

    /**
     *
     * @param c
     */
    public void selection(Carte c) {
        this.sys.selectionnerCarte(c);
    }

    /**
     *
     */
    public void attaquerPhase1() {
        this.sys.attaquerPhase1();
    }

    /**
     *
     * @return
     */
    public boolean attaquerPhase2() {
        return (this.sys.attaquerPhase2());
    }

    /**
     *
     * @return
     */
    public boolean getAttaqueMode() {
        return this.sys.isAttaqueMode();
    }

    /**
     *
     * @return
     */
    public int nombreCarte() {
        return this.m.nombreCartes();
    }

    /**
     *
     * @return
     */
    public ArrayList<Carte> getMain() {
        return this.m.getMain();
    }

    /**
     *
     * @return
     */
    public Joueur tourJoueur() {
        return this.sys.tourJoueur();
    }

    /**
     *
     * @return
     */
    public Joueur tourJoueurSuivant() {
        return this.sys.tourJoueurSuivant();
    }

    /**
     *
     */
//    public void poserCarte() {
//        for (Carte c : this.getJoueur().getMain().getMain()) { //itération sur toutes cartes dans la main
//            if (c.isSelection()) {  //Si la carte itérée est celle qui est sélectionnée
//                if (this.aPioche()) {
//                    if (this.getJoueur().getRessourceTemp() >= c.getCout()) {//Si on a suffisamment de ressources
//                      switch (c.getAttitude()) {
//                        
//                      }
//                      if (this.tourJoueur().getPartieTerrain().nbAttaque() < 5) {
//                        this.getSysteme().poserCarte(this.poser(c));        //On pose la carte
//                        this.getFileMessage().addMessage("Carte posée");   //On notifie dans la console
//                      }else this.getFileMessage().addMessage("Vous ne pouvez plus poser de cartes de ce type");
//                    } else {                                              //Sinon
//                        this.getFileMessage().addMessage("Vous n'avez pas assez de ressource"); //On notifie qu'on a pas assez de ressources
//                    }
//                } else {
//                    this.sys.addMessage("Vous devez piocher une carte avant !");
//                }
//            }
//        }
//        this.notifierObs();
//    }
    /**
     * Permet au joueur de poser une carte.
     */
    public void poserCarte() {
        this.getSysteme().poserCarte(this.getJoueur().carteSelectionne());
    }

    /**
     * Permet de passer au tour suivant
     */
    public void tourSuivant() {
        this.getSysteme().tourSuivant();
    }

  /**
   *
   */
  public void attaquerPV() {
        this.getSysteme().attaquerPV();
    }
}
